#ifndef __DYNAMICARRAY_H_
#define __DYNAMICARRAY_H_
#define ElementType void*
#include <iostream>


class DynamicArray1
{
public:
    // DynamicArray1();
    DynamicArray1(void(*free)(ElementType));
    ~DynamicArray1();
    DynamicArray1(const DynamicArray1 &d);
    DynamicArray1& operator=(const DynamicArray1 &d);

    void show(void(*func)(ElementType));//传函数指针进来
    
    //扩容
    void Resize(int newCapacity);

    //尾插法
    void InsertTail(ElementType element);

    //头插法
    void InsertHead(ElementType element);

    //中间插入
    void InsertByIndex(ElementType element, int index);//index 代表插入到哪个位置

    //按位置删除
    void RemoveByIndex(int index);

    //按值删除
    void RemoveByElement(ElementType element,bool(*isEqual)(ElementType,ElementType));

    //按位置修改
    void UpDateByIndex(int index, ElementType newElement);
    
    //按值修改
    void UpDateByElement(ElementType oldValue, ElementType newValue);

    //按位置查
    ElementType& operator[](int index);//o(1)

    //按值查找位置
    DynamicArray1 FindByElement(ElementType element);

    //排序操作
    //设置排序回调
    void SetSortCallBack(bool (*Compare)(ElementType,ElementType));
    void Sort();

    //二分查找o(logn)//如果有相同值，它就不太稳定
    int BinarySearch(ElementType element);

    //去重
    void Deduplicate();

    //归并合并
    DynamicArray1 Merge(const DynamicArray1& d);

    friend std::ostream& operator<<(std::ostream& os,const DynamicArray1 & d);

private:

    void Sort(int start, int end);//对内外分两个接口
    void(*free)(ElementType);
    bool (*Compare)(ElementType,ElementType);
    ElementType *a;
    int size;
    int capacity;
    
};

std::ostream& operator<<(std::ostream& os,const DynamicArray1 & d);


#endif